package com.excesys.exsecs.energy.controller;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.excesys.exsecs.common.core.util.R;
import com.excesys.exsecs.common.excel.annotation.ResponseExcel;
import com.excesys.exsecs.energy.service.*;
import com.excesys.exsecs.energy.vo.CommonExcelVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author zhangtailong
 * @title: EcAnalyzeController
 * @projectName pigx
 * @description: 中台 -- 能耗分析
 * @date 2024/03/01 10:25
 */
@RestController
@RequiredArgsConstructor
@RequestMapping("/ecanalyze")
@Tag(name = "能耗分析")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class EcAnalyzeController {

    //部门维度表和设备映射表
    private final DevDeptMapService devDeptMapService;
    //部门维度表
    private final DimDeptService dimDeptService;
    //区域维度表和设备映射表
    private final DevAreaMapService devAreaMapService;
    //区域维度表
    private final DimAreaService dimAreaService;
    //重点设备维度表和设备映射表
    private final DevKeqMapService devKeqMapService;
    //重点设备表
    private final DimKeqService dimKeqService;
    //分项维度表和设备映射表
    private final DevSubitemMapService devSubitemMapService;
    //分项维度表
    private final DimSubitemService dimSubitemService;
    //支路维度表和设备映射表
    private final DevBranchMapService devBranchMapService;
    //支路维度表
    private final DimBranchService dimBranchService;

    /*
     *能耗分析 - 部门总能耗量
     * @param  id 查询设备位置编码 list
     * @param date 查询时间 yyyy、yyyy-MM、yyyy-MM-dd
     * @param compareType 比较类型：0能耗 1同比，2环比
     * @param energyType 类型： 1电,2水
     * */
    @Operation(summary = "部门总能耗量", description = "部门总能耗量")
    @GetMapping("/powerData")
    public R powerData(String id, String compareType, String startDate, String endDate, String energyType) throws ParseException {
        JSONObject result = new JSONObject();
        if (energyType.equals("1")) {
            result = devDeptMapService.powerData(id, compareType, startDate, endDate);
        } else if (energyType.equals("2")) {
            result = devDeptMapService.waterData(id, compareType, startDate, endDate);
        }
        return R.ok(result, "部门总能耗量");
    }

    /*
     *能耗分析 -部门能耗柱状图
     * @param  id 查询设备位置编码 list
     * @param date 查询时间 yyyy、yyyy-MM、yyyy-MM-dd
     * @param compareType 比较类型：0能耗 1同比，2环比
     * @param energyType 类型： 1电,2水
     * */
    @Operation(summary = "部门能耗柱状图", description = "部门能耗柱状图")
    @GetMapping("/powerLayer")
    public R powerLayer(String id, String startDate, String endDate, String compareType, String energyType) throws ParseException {
        JSONObject result = new JSONObject();
        if (energyType.equals("1")) {
            result = devDeptMapService.powerLayer(id, startDate, endDate, compareType);
        } else if (energyType.equals("2")) {
            result = devDeptMapService.waterLayer(id, startDate, endDate, compareType);
        }
        return R.ok(result, "部门能耗柱状图");
    }

    /*
     *能耗分析 -部门能耗 -桑基图
     * */
    @Operation(summary = "部门桑基图", description = "部门桑基图")
    @GetMapping("/powerDepSanchitou")
    public R powerDepSanchitou(String id, String startDate, String endDate) {
        return R.ok(dimDeptService.powerDepSanchitou(id, startDate, endDate), "部门桑基图");
    }

    /*
     * - 部门饼状图
     * @param startDate 查询时间 yyyy、yyyy-MM、yyyy-MM-dd
     * @param endDate 查询时间 yyyy、yyyy-MM、yyyy-MM-dd
     * */
    @Operation(summary = "部门饼状图", description = "部门饼状图")
    @GetMapping("/powerDepBingtu")
    public R powerDepBingtu(String startDate, String endDate) {
        return R.ok(dimDeptService.powerDepBingtu(startDate, endDate), "部门饼状图");
    }


    /*
     *能耗分析 - 区域 - 总能耗量
     * @param  id 查询设备位置编码 list
     * @param date 查询时间 yyyy、yyyy-MM、yyyy-MM-dd
     * @param compareType 比较类型：0能耗 1同比，2环比
     * @param energyType 类型： 1电,2水
     * */
    @Operation(summary = "区域总能耗量", description = "区域总能耗量")
    @GetMapping("/powerAreaData")
    public R powerAreaData(String id, String startDate, String endDate, String compareType, String energyType) throws ParseException {
        JSONObject result = new JSONObject();
        if (energyType.equals("1")) {
            result = devAreaMapService.powerAreaData(id, startDate, endDate, compareType);
        } else if (energyType.equals("2")) {
            result = devAreaMapService.powerAreaWaterData(id, startDate, endDate, compareType);
        }
        return R.ok(result, "区域总能耗量");
    }

    /*
     *能耗分析 - 区域 - 能耗柱状图
     * @param energyType 类型： 1电,2水
     * */
    @Operation(summary = "区域能耗柱状图", description = "区域能耗柱状图")
    @GetMapping("/powerAreaLayer")
    public R powerAreaLayer(String id, String startDate, String endDate, String compareType, String energyType) throws ParseException {
        JSONObject result = new JSONObject();
        if (energyType.equals("1")) {
            result = devAreaMapService.powerAreaLayer(id, startDate, endDate, compareType);
        } else if (energyType.equals("2")) {
            result = devAreaMapService.powerAreaWaterLayer(id, startDate, endDate, compareType);
        }
        return R.ok(result, "区域能耗柱状图");
    }

    /*
     *能耗分析 - 区域 -桑基图
     * */
    @Operation(summary = "区域桑基图", description = "区域桑基图")
    @GetMapping("/powerAreaSanchitou")
    public R powerAreaSanchitou(String id, String startDate, String endDate) {
        return R.ok(dimAreaService.powerAreaSanchitou(id, startDate, endDate), "区域桑基图");
    }

    /*
     * - 区域饼状图
     * @param startDate 查询时间 yyyy、yyyy-MM、yyyy-MM-dd
     * @param endDate 查询时间 yyyy、yyyy-MM、yyyy-MM-dd
     * */
    @Operation(summary = "区域饼状图", description = "区域饼状图")
    @GetMapping("/powerAreaBingtu")
    public R powerAreaBingtu(String startDate, String endDate) {
        return R.ok(dimAreaService.powerAreaBingtu(startDate, endDate), "区域饼状图");
    }

    /*
     *能耗分析 - 重点设备 - 总能耗量
     * @param  id 查询设备位置编码 list
     * @param date 查询时间 yyyy、yyyy-MM、yyyy-MM-dd
     * @param compareType 比较类型：0能耗 1同比，2环比
     * */
    @Operation(summary = "重点设备总能耗量", description = "重点设备总能耗量")
    @GetMapping("/powerKeqData")
    public R powerKeqData(String id, String startDate, String endDate, String compareType) throws ParseException {
        return R.ok(devKeqMapService.powerKeqData(id, startDate, endDate, compareType), "重点设备总能耗量");
    }

    /*
     *能耗分析 - 重点设备 - 能耗柱状图
     * */
    @Operation(summary = "重点设备能耗柱状图", description = "重点设备能耗柱状图")
    @GetMapping("/powerKeqLayer")
    public R powerKeqLayer(String id, String startDate, String endDate, String compareType) throws ParseException {
        return R.ok(devKeqMapService.powerKeqLayer(id, startDate, endDate, compareType), "重点设备能耗柱状图");
    }

    /*
     *能耗分析 - 重点设备 -桑基图
     * */
    @Operation(summary = "重点设备桑基图", description = "重点设备桑基图")
    @GetMapping("/powerKeqSanchitou")
    public R powerKeqSanchitou(String id, String startDate, String endDate) {
        return R.ok(dimKeqService.powerKeqSanchitou(id, startDate, endDate), "重点设备桑基图");
    }

    /*
     * - 重点设备饼状图
     * @param startDate 查询时间 yyyy、yyyy-MM、yyyy-MM-dd
     * @param endDate 查询时间 yyyy、yyyy-MM、yyyy-MM-dd
     * */
    @Operation(summary = "重点设备饼状图", description = "重点设备饼状图")
    @GetMapping("/powerKeqBingtu")
    public R powerKeqBingtu(String startDate, String endDate) {
        return R.ok(dimKeqService.powerKeqBingtu(startDate, endDate), "重点设备饼状图");
    }

    /*
     *能耗分析 - 分项 - 总能耗量
     * @param  id 查询设备位置编码 list
     * @param date 查询时间 yyyy、yyyy-MM、yyyy-MM-dd
     * @param compareType 比较类型：0能耗 1同比，2环比
     * */
    @Operation(summary = "分项总能耗量", description = "分项总能耗量")
    @GetMapping("/powerSubitemData")
    public R powerSubitemData(String id, String startDate, String endDate, String compareType) throws ParseException {
        return R.ok(devSubitemMapService.powerSubitemData(id, startDate, endDate, compareType), "分项总能耗量");
    }

    /*
     *能耗分析 - 分项 - 能耗柱状图
     * */
    @Operation(summary = "分项能耗柱状图", description = "区域能耗柱状图")
    @GetMapping("/powerSubitemLayer")
    public R powerSubitemLayer(String id, String startDate, String endDate, String compareType) throws ParseException {
        return R.ok(devSubitemMapService.powerSubitemLayer(id, startDate, endDate, compareType), "分项能耗柱状图");
    }

    /*
     *能耗分析 - 分项 -桑基图
     * */
    @Operation(summary = "分项桑基图", description = "分项桑基图")
    @GetMapping("/powerSubitemSanchitou")
    public R powerSubitemSanchitou(String id, String startDate, String endDate) {
        return R.ok(dimSubitemService.powerSubitemSanchitou(id, startDate, endDate), "分项桑基图");
    }

    /*
     * - 分项饼状图
     * @param startDate 查询时间 yyyy、yyyy-MM、yyyy-MM-dd
     * @param endDate 查询时间 yyyy、yyyy-MM、yyyy-MM-dd
     * */
    @Operation(summary = "分项饼状图", description = "分项饼状图")
    @GetMapping("/powerSubitemBingtu")
    public R powerSubitemBingtu(String startDate, String endDate) {
        return R.ok(dimSubitemService.powerSubitemBingtu(startDate, endDate), "分项饼状图");
    }

    /*
     *能耗分析 - 支路 - 总能耗量
     * @param  id 查询设备位置编码 list
     * @param date 查询时间 yyyy、yyyy-MM、yyyy-MM-dd
     * @param compareType 比较类型：0能耗 1同比，2环比
     * */
    @Operation(summary = "支路总能耗量", description = "支路总能耗量")
    @GetMapping("/powerBranchData")
    public R powerBranchData(String id, String startDate, String endDate, String compareType) throws ParseException {
        return R.ok(devBranchMapService.powerBranchData(id, startDate, endDate, compareType), "支路总能耗量");
    }

    /*
     *能耗分析 - 支路 - 能耗柱状图
     * */
    @Operation(summary = "支路能耗柱状图", description = "支路能耗柱状图")
    @GetMapping("/powerBranchLayer")
    public R powerBranchLayer(String id, String startDate, String endDate, String compareType) throws ParseException {
        return R.ok(devBranchMapService.powerBranchLayer(id, startDate, endDate, compareType), "支路能耗柱状图");
    }

    /*
     *能耗分析 - 支路 -桑基图
     * */
    @Operation(summary = "支路桑基图", description = "支路桑基图")
    @GetMapping("/powerBranchSanchitou")
    public R powerBranchSanchitou(String id, String startDate, String endDate) {
        return R.ok(dimBranchService.powerBranchSanchitou(id, startDate, endDate), "支路桑基图");
    }

    /*
     * - 支路饼状图
     * @param startDate 查询时间 yyyy、yyyy-MM、yyyy-MM-dd
     * @param endDate 查询时间 yyyy、yyyy-MM、yyyy-MM-dd
     * */
    @Operation(summary = "支路饼状图", description = "支路饼状图")
    @GetMapping("/powerBranchBingtu")
    public R powerBranchBingtu(String startDate, String endDate) {
        return R.ok(dimBranchService.powerBranchBingtu(startDate, endDate), "支路饼状图");
    }


    /**
     * 能耗统计分析 导出excel 表格
     *
     * @param dimType    统计维度 1: 区域 2: 部门  3: 设备 4: 支路
     * @param energyType 能耗类型 1电表  2水表  3气。。。
     * @return excel 文件流
     */
    @ResponseExcel
    @GetMapping("/exportExcel")
    public List<CommonExcelVO> exportExcel(String id, String dimType, String energyType, String startDate, String endDate) {
        List<CommonExcelVO> reportList = new ArrayList<>();
        if (dimType.equals("1")) {
            JSONObject jsonObject = dimAreaService.powerAreaSanchitou(id, startDate, endDate);
            JSONArray jsonArray = jsonObject.getJSONArray("tableData");
            for (Object obj : jsonArray) {
                CommonExcelVO commonExcelVO = new CommonExcelVO();
                JSONObject json = (JSONObject) JSONObject.toJSON(obj);
                commonExcelVO.setReportName(json.getString("areaName"));
                commonExcelVO.setReportValue(json.getString("value"));
                reportList.add(commonExcelVO);
            }
        }
        if (dimType.equals("2")) {
            JSONObject jsonObject = dimDeptService.powerDepSanchitou(id, startDate, endDate);
            JSONArray jsonArray = jsonObject.getJSONArray("tableData");
            for (Object obj : jsonArray) {
                CommonExcelVO commonExcelVO = new CommonExcelVO();
                JSONObject json = (JSONObject) JSONObject.toJSON(obj);
                commonExcelVO.setReportName(json.getString("deptName"));
                commonExcelVO.setReportValue(json.getString("value"));
                reportList.add(commonExcelVO);
            }
        }
        if (dimType.equals("3")) {
            JSONObject jsonObject = dimKeqService.powerKeqSanchitou(id, startDate, endDate);
            JSONArray jsonArray = jsonObject.getJSONArray("tableData");
            for (Object obj : jsonArray) {
                CommonExcelVO commonExcelVO = new CommonExcelVO();
                JSONObject json = (JSONObject) JSONObject.toJSON(obj);
                commonExcelVO.setReportName(json.getString("keqName"));
                commonExcelVO.setReportValue(json.getString("value"));
                reportList.add(commonExcelVO);
            }
        }
        if (dimType.equals("4")) {
            JSONObject jsonObject = dimBranchService.powerBranchSanchitou(id, startDate, endDate);
            JSONArray jsonArray = jsonObject.getJSONArray("tableData");
            for (Object obj : jsonArray) {
                CommonExcelVO commonExcelVO = new CommonExcelVO();
                JSONObject json = (JSONObject) JSONObject.toJSON(obj);
                commonExcelVO.setReportName(json.getString("branchName"));
                commonExcelVO.setReportValue(json.getString("value"));
                reportList.add(commonExcelVO);
            }
        }
        return reportList;
    }

    /*
     * - 部门趋势分析
     * @param startDate 查询时间 yyyy、yyyy-MM、yyyy-MM-dd
     * @param endDate 查询时间 yyyy、yyyy-MM、yyyy-MM-dd
     * @param  id 查询设备位置编码 list
     * @param energyType 类型： 1电,2水,3冷
     */
    @Operation(summary = "部门趋势分析", description = "部门趋势分析")
    @GetMapping("/powerDeptTrendData")
    public R powerDeptTrendData(String id, String startDate, String endDate, String energyType) throws ParseException {
        JSONObject result = new JSONObject();
        if (energyType.equals("1")) {
            result = devDeptMapService.powerDeptTrendData(id, startDate, endDate);
        } else if (energyType.equals("2")) {
        }
        return R.ok(result, "部门总能耗量");
    }
}
